#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'''
ax2+bx+c=0
x=(-b+-sqrt(b2-4ac))/2a
'''

import math


def quadratic(a, b, c):
	d=b**2-4*a*c
	if d<0: 
		return "no answer"
	else:
		d_=math.sqrt(d)
		x1=(-b+d_)/(2*a)
		x2=(-b-d_)/(2*a)
		return x1,x2


''' 
一是必选参数在前，默认参数在后，
否则Python的解释器会报错（思考一下为什么默认参数不能放在必选参数前面）；
'''
def power(x, n=2):
	res = 1
	while n>0:
		res = res*x
		n = n-1
	return res


'''
默认参数大坑
因为L指向了对象[]，当连续多次执行add_end()的时候就会下面这种情况
>>> add_end()
['END']
>>> add_end()
['END', 'END']
>>> add_end()
['END', 'END', 'END']

Python函数在定义的时候，默认参数L的值就被计算出来了，即[]，
因为默认参数L也是一个变量，它指向对象[]，
每次调用该函数，如果改变了L的内容，则下次调用时，默认参数的内容就变了，不再是函数定义时的[]了。
定义默认参数要牢记一点：默认参数必须指向不变对象！
'''
'''
def add_end(L=[]):
	L.append('END')
	return
'''

# 要修改上面的例子，我们可以用None这个不变对象来实现：
# 现在，无论调用多少次，都不会有问题：
def add_end(L=None):
	if L is None:
		L=[]
	L.append('END')
	return


# 可变参数,在参数前面加一个*
# *args是可变参数，args接收的是一个tuple；
# 可变参数就是传入的参数个数是可变的，可以是1个、2个到任意个，还可以是0个
# 调用：
# calc(1)
# calc(1, 2)
# a=[1, 2, 3]
# calc(*a)
def calc(*num):
	sum = 0
	for i in num:
		sum = sum+i**2
	return sum


# 关键字参数，在参数前面加两个*
# **kw是关键字参数，kw接收的是一个dict。
'''
>>> person('Tom', 18)
name: Tom, age: 18, other: {}

>>> person('Tom', 18, city='BeiJing')
name: Tom, age: 18, other: {'city': 'BeiJing'}

>>> person('Tom', 18, city='BeiJing', job='Eng')
name: Tom, age: 18, other: {'city': 'BeiJing', 'job': 'Eng'}

>>> c={'city': 'Beijing', 'job': 'Eng'}
>>> person('Tom', 18, **c)
name: Tom, age: 18, other: {'city': 'Beijing', 'job': 'Eng'}

注意kw获得的dict是c的一份拷贝，对kw的改动不会影响到函数外的c。
'''
def person(name, age, **kw):
	print("name: %s, age: %s, other: %s"%(name, age, kw))


# 命名关键字参数
# 如果要限制关键字参数的名字，就可以用命名关键字参数，
# 例如，只接收city和job作为关键字参数。这种方式定义的函数如下
# 和关键字参数**kw不同，命名关键字参数需要一个特殊分隔符*，*后面的参数被视为命名关键字参数
'''
>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer

如果函数定义中已经有了一个可变参数，后面跟着的命名关键字参数就不再需要一个特殊分隔符*了：

def person(name, age, *args, city, job):
    print(name, age, args, city, job)

命名关键字参数必须传入参数名，这和位置参数不同。如果没有传入参数名，调用将报错：

>>> person('Jack', 24, 'Beijing', 'Engineer')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: person() takes 2 positional arguments but 4 were given

'''
def person(name, age, *， city, job):
	# pass
	print(name, age, city, job)


# 参数组合
# 在Python中定义函数，可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数，
# 这5种参数都可以组合使用。但是请注意，参数定义的顺序必须是：
# 必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
def main(argv):
	r=quadratic(1, 3, -4)
	print(r)


if __name__ == 'main':
	print("Hello X!")